package com.kclm.xsap.web.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.kclm.xsap.entity.*;
import com.kclm.xsap.service.*;
import com.kclm.xsap.utils.R;
import com.kclm.xsap.utils.time.Data;
import com.kclm.xsap.vo.IndexHomeDateVo;
import com.kclm.xsap.vo.indexStatistics.IndexAddAndStreamInfoVo;
import com.kclm.xsap.vo.indexStatistics.IndexPieChartVo;
import com.kclm.xsap.vo.register.RegisterVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;

@Slf4j
@Controller
@RequestMapping("/index")
public class IndexController {
    @Autowired
    private EmployeeService employeeService;
    @Autowired
    private MemberCardService memberCardService;
    @Autowired
    private MemberBindRecordService memberBindRecordService;
    @Autowired
    private MemberService memberService;
    @Autowired
    private ReservationRecordService reservationRecordService;
    @Autowired
    private RechargeRecordService rechargeRecordService;

    @GetMapping("/index")
    public String index() {
        return "index";
    }

    /**
     * 首页
     */
    @GetMapping("/x_index_home.do")
    public String index_home() {
        return "x_index_home";
    }

    /**
     * 注册
     * @return
     */
    @GetMapping("/toRegister")
    public String toRegister() {
        return "x_register";
    }
    @PostMapping("/register")
    public String Register(RegisterVo registerVo, Model model) {
        int count = employeeService.count(new QueryWrapper<EmployeeEntity>().eq("name", registerVo.getUserName()));
        if (count > 0) {
            model.addAttribute("CHECK_TYPE_ERROR", 0);
            return "x_register";
        }
        if (!registerVo.getPassword().equals(registerVo.getPwd2())) {
            model.addAttribute("CHECK_TYPE_ERROR", 1);
            return "x_register";
        } else {
            EmployeeEntity employeeEntity = new EmployeeEntity();
            employeeEntity.setName(registerVo.getUserName());
            employeeEntity.setRolePassword(registerVo.getPassword());
            employeeService.save(employeeEntity);
            return "redirect:/user/toLogin";
        }
    }
    @PostMapping("/registerName")
    @ResponseBody
    public R registerName(String username) {
        System.out.println(username);
        int count = employeeService.count(new QueryWrapper<EmployeeEntity>().eq("name", username));
        if (count > 0) {
            return R.ok().put("data", 1);
        }
        return R.ok();
    }

    /**
     * 退出登录
     */
    @GetMapping("/logout")
    public String logout(HttpSession session) {
        log.info("用户退出，销毁当前客户的会话");
        // 销毁当前会话
        session.invalidate();
        return "redirect:/user/toLogin";
    }

    /**
     * 统计会员卡数量并生成饼图数据
     * @return 包含饼图数据的响应对象
     */
    @PostMapping("/homePageInfo/statisticsOfMemberCard.do")
    @ResponseBody
    public R statisticsOfMemberCard() {
        // 获取所有会员卡信息
        List<MemberCardEntity> cardEntityList = memberCardService.list(null);
        // 记录日志：输出所有会员卡信息
        log.debug("所有会员卡{}", cardEntityList);
        // 如果会员卡列表为空，则返回错误响应：还没有创建会员卡
        if (cardEntityList.isEmpty()) {
            return R.error("还没有创建会员卡");
        }
        // 初始化存储饼图数据的列表
        List<IndexPieChartVo> indexPieChartVos = new ArrayList<>();
        // 遍历每个会员卡，统计绑定记录数量，并生成对应的饼图数据
        for (MemberCardEntity memberCardEntity : cardEntityList) {
            IndexPieChartVo indexPieChartVo = new IndexPieChartVo();
            // 查询该会员卡的绑定记录数量
            int count = memberBindRecordService.count(new QueryWrapper<MemberBindRecordEntity>().eq("card_id", memberCardEntity.getId()));
            // 设置饼图数据的名称为会员卡名称
            indexPieChartVo.setName(memberCardEntity.getName());
            // 设置饼图数据的值为绑定记录数量
            indexPieChartVo.setValue(count);
            // 将该饼图数据添加到列表中
            indexPieChartVos.add(indexPieChartVo);
        }
        // 返回成功响应，并将饼图数据放入响应中
        return R.ok().put("data", indexPieChartVos);
    }


    /**
     * 统计新增会员和流失会员数量并生成柱状图数据
     * @return 包含柱状图数据的响应对象
     */
    @GetMapping("/homePageInfo/statisticsOfNewAndLostPeople.do")
    @ResponseBody
    public R newAndLostPeople() {
        // 获取当前日期的天数
        int day = LocalDate.now().getDayOfMonth();
        // 初始化存储柱状图数据的对象
        IndexAddAndStreamInfoVo infoVo = new IndexAddAndStreamInfoVo();
        // 获取天数
        List<String> time = new ArrayList<>();
        for (int i = 1; i <= day; i++) {
            time.add(String.valueOf(i));
        }
        // 查找所有成员
        List<MemberEntity> memberEntityList = memberService.selectAll();
        // 初始化存储所有成员的创建时间列表
        List<LocalDateTime> createTimeList = new ArrayList<>();
        // 获取所有成员的创建时间
        for (MemberEntity memberEntity : memberEntityList) {
            createTimeList.add(memberEntity.getCreateTime());
        }
        // 统计每天新增会员数量
        List<Integer> data = Data.Data(createTimeList, time);
        // 查找所有流失成员的日期
        List<LocalDateTime> delTimeList = memberService.delTimelist();//根据是否被注销计算的流失人员
        // 统计每天流失会员数量
        List<Integer> data2 = Data.Data(delTimeList, time);
        // 设置柱状图数据对象的横坐标名称
        infoVo.setXname("/日");
        // 设置柱状图数据对象的时间列表
        infoVo.setTime(time);
        // 设置柱状图数据对象的新增会员数量列表
        infoVo.setData(data);
        // 设置柱状图数据对象的流失会员数量列表
        infoVo.setData2(data2);
        // 返回成功响应，并将柱状图数据对象放入响应中
        return R.ok().put("data", infoVo);
    }


    /**
     * 统计会员每日充值金额并生成折线图数据
     * @return 包含折线图数据的响应对象
     */
    @GetMapping("/homePageInfo/statisticsOfDailyCharge.do")
    @ResponseBody
    public R dailyCharge() {
        // 获取当前日期的天数
        int day = LocalDate.now().getDayOfMonth();
        // 查询当月所有充值记录
        List<RechargeRecordEntity> rechargeRecordEntityList = rechargeRecordService.list(new QueryWrapper<RechargeRecordEntity>()
                .select("received_money", "create_time")
                .likeRight("create_time", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM")))
        );
        // 初始化存储每日充值金额的映射
        HashMap<Integer, Integer> moneyAndDateList = new HashMap<>();
        // 遍历充值记录，统计每日充值金额
        for (RechargeRecordEntity rechargeRecordEntity : rechargeRecordEntityList) {
            int rechargeOfOnce = rechargeRecordEntity.getReceivedMoney().intValue();
            int dayOfMonth = rechargeRecordEntity.getCreateTime().getDayOfMonth();
            moneyAndDateList.put(dayOfMonth, moneyAndDateList.getOrDefault(dayOfMonth, 0) + rechargeOfOnce);
        }
        // 初始化存储折线图横坐标（时间）和纵坐标（充值金额）的列表
        List<String> time = new ArrayList<>();
        List<Integer> data = new ArrayList<>();
        // 遍历每一天，获取该天的充值金额，若无则设为0
        for (int i = 1; i <= day; i++) {
            time.add(String.valueOf(i));
            data.add(moneyAndDateList.getOrDefault(i, 0));
        }
        // 初始化存储折线图数据的对象
        IndexAddAndStreamInfoVo infoVo = new IndexAddAndStreamInfoVo();
        // 设置折线图标题
        infoVo.setTitle("当月每日收费统计");
        // 设置折线图横坐标名称
        infoVo.setXname("日");
        // 设置折线图横坐标（时间）
        infoVo.setTime(time);
        // 设置折线图纵坐标（充值金额）
        infoVo.setData(data);
        // 返回成功响应，并将折线图数据对象放入响应中
        return R.ok().put("data", infoVo);
    }


    /**
     * 获取首页信息数据
     * @return 包含首页信息数据的响应对象
     */
    @PostMapping("/homePageInfo.do")
    @ResponseBody
    public R homePageInfo() {
        // 初始化存储首页信息数据的对象
        IndexHomeDateVo indexHomeDateVo = new IndexHomeDateVo();
        // 统计会员总数
        int countMembers = memberService.count(null);
        indexHomeDateVo.setTotalMembers(countMembers);
        // 统计最近30天活跃用户
        List<ReservationRecordEntity> reservationRecordEntityList = reservationRecordService.list(new QueryWrapper<ReservationRecordEntity>().select("member_id")
                .le("create_time", LocalDateTime.now())
                .ge("create_time", LocalDateTime.now().minusDays(30)));
        // 使用Set存储活跃用户的ID，避免重复
        Set<Long> ids = new TreeSet<>();
        for (ReservationRecordEntity reservationRecordEntity : reservationRecordEntityList) {
            ids.add(reservationRecordEntity.getMemberId());
        }
        // 设置活跃用户数
        indexHomeDateVo.setActiveMembers(ids.size());
        // 统计预约总数
        int countActive = reservationRecordService.count(new QueryWrapper<ReservationRecordEntity>().eq("status", 1));
        indexHomeDateVo.setTotalReservations(countActive);
        // 返回成功响应，并将首页信息数据对象放入响应中
        return R.ok().put("data", indexHomeDateVo);
    }

}
